/**
 * 落石冲击荷载计算相关算法实现
 * 提供隧道工程中落石冲击效应的分析计算功能
 * 包括冲击荷载计算和冲击强度评估等核心算法
 */
export class RockfallAlgorithms {

  /**
   * 落石冲击荷载组合计算
   * 综合计算落石冲击的关键参数，包括速度、冲击时间和冲击荷载
   * 基于能量守恒和动量定理，考虑了落石特性和缓冲层影响
   * 
   * @param mr 落石质量(kg)，落石的总质量
   * @param Hr 下落高度(m)，落石从释放点到冲击点的垂直距离
   * @param Tb 缓冲层厚度(m)，结构表面的缓冲材料厚度
   * @param g 重力加速度(m/s²)，默认值为9.8m/s²
   * @returns {v0: number, t: number, Fr: number} 落石冲击参数计算结果
   * @returns {number} v0 - 落石冲击速度(m/s)，冲击瞬间的瞬时速度
   * @returns {number} t - 冲击时间(s)，冲击过程持续的时间
   * @returns {number} Fr - 冲击荷载(kN)，落石与结构撞击时产生的总冲击力
   */
  static calculateRockImpactLoad(mr: number, Hr: number, Tb: number, g: number = 9.8): { v0: number, t: number, Fr: number } {
    // 计算落石冲击速度: v0 = √(2g·Hr)
    // 基于自由落体运动的速度计算公式，忽略空气阻力
    const v0 = Math.sqrt(2 * g * Hr);
    
    // 计算冲击时间: t = (0.097mr·g + 2.21Tb + 0.045/Hr + 1.2)/100
    // 经验公式，综合考虑了落石质量、缓冲层厚度和下落高度的影响
    const t = (0.097 * mr * g + 2.21 * Tb + 0.045 / Hr + 1.2) / 100;
    
    // 计算冲击荷载: Fr = (mr·v0)/(1000t)
    // 基于动量定理：冲量(F·t)等于动量变化(m·v)，单位转换为kN
    const Fr = (mr * v0) / (1000 * t);
    
    return { v0, t, Fr };
  }

    /**
   * 落石冲击荷载强度计算
   * 计算落石冲击作用在结构上的压力强度
   * 考虑了落石尺寸、缓冲层效果和冲击扩散的影响
   * 
   * @param Fr 冲击荷载(kN)，落石与结构撞击时产生的总冲击力
   * @param Dr 落石直径(m)，落石的等效直径
   * @param Tb 缓冲层厚度(m)，结构表面的缓冲材料厚度
   * @param beta 冲击荷载扩散角(°)，荷载在缓冲层中扩散的角度
   * @returns {number} 冲击荷载强度(kPa)，单位面积上的冲击力
   */
  static rockImpactStrength(Fr: number, Dr: number, Tb: number, beta: number): { rock_impact_strength: number } {
    // 将角度从度数转换为弧度，用于数学计算
    const beta_rad = beta * Math.PI / 180;
    
    // 计算荷载扩散后的等效半径: r = D_r/2 + T_b·tanβ
    // 其中 D_r/2 是落石半径，T_b·tanβ 是由于缓冲层扩散增加的半径
    const radius_term = Dr / 2 + Tb * Math.tan(beta_rad);
    
    // 计算冲击荷载强度: p_r = F_r / πr²
    // 压力强度等于总荷载除以作用面积（圆形面积）
    return { rock_impact_strength: Fr / (Math.PI * Math.pow(radius_term, 2)) };
  }
}